home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F+,G+,I-,L-,N-,O-,R-,S-,V+,X-}
-
- Unit Mxmsst;
- Interface
- Uses Mxms,Objects;
-
- { (c) Emilio David Diaus López 1994 }
- { Flujo "stream" para el control de la memoria extendida }
- { Es un equivalente a PEMSstream pero en vez de utilizar }
- { memoria expandida utiliza memoria extendida o ampliada }
- { Se deriva de Tstream y los métodos que hay que cambiar }
- { cambiar siempre que se derive un stream de Tstream son: }
- { GetPos,GetSize, Read, Seek, Truncate y Write y si fuera }
- { un stream con buffer habría que cambiar el método Flush }
-
- { Se considera el flujo como si fuera un fichero del disco }
- { y se pueden llevar a cabo las mismas operaciones que en }
- { Tdosstream o Tstream }
-
- {
- 6. Mxmsst: Control De La Memoria Extendida Mediante
- Flujos
-
- Este MóDulo Es Una AmpliacióN De Los Objetos Tstream Como
- Tdosstream Y Temsstream, Utiliza El MóDulo Mxms Para La Gestión
- De La Memoria Extendida Crea Un Objeto Txmsstream Descendiente
- De Tstream Así Se Puede Configurar FáCilmente Para El Manejo De
- Memoria Extendida, Expandida O Disco Duro Con Un Solo Objeto
- Variable, Cambia Los MéTodos Getpos, Getsize, Read, Seek,
- Truncate Y Write Y Si Fuera Un Stream Con BúFer HabríA Que
- Cambiar El MéTodo Flush, Este Es El Procedimiento EstáNdar Para
- Derivar De Tstream Otro "Flujo", Se Considera El Flujo Como Si
- Fuera Un Fichero Del Disco Y Se Pueden Llevar A Cabo Las Mismas
- Operaciones Que En Tdosstream O Tstream En El Fichero De CóDigo
- Fuente Se Puede Encontrar Mas InformacióN.
- }
-
- Type Pxmsstream=^Txmsstream;
- Txmsstream=Object(Tstream) { derivación de Tstream }
-
- { métodos y variables públicas }
-
- Constructor Init(Asize:Longint);
- Destructor Done;Virtual;
-
- Function Getpos:Longint;Virtual;
- Function Getsize:Longint;Virtual;
-
- Procedure Write(Var Buf;Count:Word);Virtual;
- Procedure Read(Var Buf;Count:Word);Virtual;
- Procedure Seek(Pos:Longint);Virtual;
- Procedure Truncate;Virtual;
-
- { métodos y variables privadas }
-
- Private
- Handle:Word;
- Position:Longint;
- Size:Longint;
- End;
-
-
- Implementation
-
- { inicialización del flujo }
-
- Constructor Txmsstream.Init;
- Begin
- Tstream.Init;
- Position:=0;
- Size:=Asize;
- If Not(Hayxms) Then Fail;
- Handle:=Nuevo_Bloque((Asize+1) Div 1024);
- If Error_Xms<>0 Then Begin { si no hay suficiente XMS se }
- { interrumpe la inicialización }
- Fail; { del flujo }
- End;
- End;
-
- { dispone y finaliza el flujo }
-
- Destructor Txmsstream.Done;
- Begin
- Dispon_Bloque(Handle);
- Tstream.Done;
- End;
-
- { devuelve el tamaño del flujo }
-
- Function Txmsstream.Getsize:Longint;
- Begin
- Getsize:=Size;
- End;
-
- { devuelve la posición del puntero del ofset del flujo }
-
- Function Txmsstream.Getpos:Longint;
- Begin
- Getpos:=Position;
- End;
-
- { escribe count bytes en el flujo }
-
- Procedure Txmsstream.Write(Var Buf;Count:Word);
- Var Lbuf:Longint;
- Pos:Longint;
- Begin
- Lbuf:=Longint(@Buf);
- Pos:=Getpos;
- If Count Mod 2<>0 Then Inc(Count);
- Mover_Bloque_Emb(0,Lbuf,Handle,Pos,Count);
- If Count Mod 2<>0 Then Dec(Count);
- If Error_Xms<>0 Then Begin
- Error(Error_Xms,Stwriteerror);
- End;
- Seek(Position+Count); { actualiza el puntero de ofset }
- End;
-
- { lee count bytes del flujo }
-
- Procedure Txmsstream.Read(Var Buf;Count:Word);
- Var Lbuf:Longint;
- Pos:Longint;
- Begin
- Lbuf:=Longint(@Buf);
- Pos:=Getpos;
- If Count Mod 2<>0 Then Inc(Count);
- Mover_Bloque_Emb(Handle,Pos,0,Lbuf,Count);
- If Count Mod 2<>0 Then Dec(Count);
- If Error_Xms<>0 Then Begin
- Error(Error_Xms,Streaderror);
- End;
- Seek(Position+Count); { actualiza el puntero de ofset }
- End;
-
- { Coloca el puntero en una posición determinada respecto del }
- { principio del flujo y a partir de ahí leer o escribir }
-
- Procedure Txmsstream.Seek(Pos:Longint);
- Begin
- If Pos<=Getsize Then
- Position:=Pos
- Else
- Error(0,Sterror);
- End;
-
- { trunca el flujo a la posición actual del puntero de ofset }
-
- Procedure Txmsstream.Truncate;
- Var Bien:Boolean;
- Begin
- Seek(Position);
- Bien:=Cambiar_Tamano_Bloque(Handle,Position Div 1024);
- If Not(Bien) Then Begin
- Error(Error_Xms,Sterror);
- Exit;
- End;
- Bien:=Cambiar_Tamano_Bloque(Handle,Size Div 1024);
- If Not(Bien) Then
- Error(Error_Xms,Sterror);
- End;
-
- End.
-